package com.wanghaixin.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wanghaixin.dao.SysMenuMapper;
import com.wanghaixin.dto.DataGridResult;
import com.wanghaixin.dto.QueryDTO;
import com.wanghaixin.pojo.SysMenu;
import com.wanghaixin.service.MenuService;
import com.wanghaixin.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @Auther: 王海新
 * @Date: 2020/10/22 17:38
 * @Description:
 */
@Service
public class MenuServiceImpl implements MenuService
{

    @Autowired
    private SysMenuMapper sysMenuMapper;

    @Override
    public DataGridResult findMenu(QueryDTO queryDTO) {
        //分页插件 拿到分页的数据
        PageHelper.offsetPage(queryDTO.getOffset(),queryDTO.getLimit());

        //页面上试菜单id来排序的，判断是否设置了。
        if (queryDTO.getSort() != null && !queryDTO.getSort().equals("")) {
            //因为前端传递过来的是menuid，和数据库中的不同，所以这里进行转换。
            queryDTO.setSort("menu_id");
        }
        //将取回的数据封装到DataGridResult中。
        List<SysMenu> menuByPage = sysMenuMapper.findMenuByPage(queryDTO);
        PageInfo<SysMenu> info = new PageInfo<SysMenu>(menuByPage);
        long total = info.getTotal();
        DataGridResult result = new DataGridResult(total,info.getList());
        return result;
    }

    //对于增删改查，可以增加事务的注解
    @Transactional(propagation = Propagation.REQUIRED)
    public R deleteMenu(List<Long> ids) {

        //防止系统栏被删除
        for (Long id : ids) {
            if (id<51){
                return R.error("系统菜单，不支持删除");
            }
        }
        int i = sysMenuMapper.deleteMenu(ids);
        if (i > 0) {
            return R.ok();
        }else{
            return R.error(-200 ,"删除失败");
        }
    }

    @Override
    public R selectMenu() {

        List<SysMenu> menu = sysMenuMapper.findMenu();

        //手动设置根目录。
        SysMenu sysMenu  = new SysMenu();
        sysMenu.setMenuId(0L);
        sysMenu.setType(0);
        sysMenu.setParentId(-1L);
        sysMenu.setName("一级菜单");
        menu.add(sysMenu);

        return R.ok().put("menuList",menu);
    }

    @Override
    public R saveMenu(SysMenu sysMenu) {
        int i = sysMenuMapper.insertSelective(sysMenu);
        return i > 0 ? R.ok() : R.error("添加失败");
    }

    @Override
    public R findMenuById(Long menuId) {
        SysMenu sysMenu = sysMenuMapper.selectByPrimaryKey(menuId);
        return R.ok().put("menu",sysMenu);
    }

    @Override
    public R updateMenu(SysMenu sysMenu) {

        int update = sysMenuMapper.updateByPrimaryKeySelective(sysMenu);
        return update > 0 ? R.ok() : R.error("修改失败");
    }

    @Override
    public List<String> findPermsByUserId(Long userId) {
        //从mapper中取出权限字段
        List<String> permsByUserId = sysMenuMapper.findPermsByUserId(userId);
        //创建hashSet集合，存储字段
        Set<String> set = new HashSet<String>();
        //迭代取出来的数据
        for (String s : permsByUserId) {
            //对数据进行判空
            if (s != null && !s.equals("")) {
                //如果不为空 进入到此出，因为一个用户可能有多个权限，
                // 在数据库中我们以 ， 号分隔开。所以这里用 ， 号将不同权限分割，
                // 然后添加到hashSet中
                String[] split = s.split(",");
                for (String s1 : split) {
                    set.add(s1);
                }
            }
        }
        //封装到一个list集合中，然后我们再去开发一个realm包
        List<String> perms = new ArrayList<>();
        perms.addAll(set);
        return perms;
    }

    @Override
    public R findUserMenu(Long userId) {
        //查询用户的一级菜单
        List<Map<String,Object>> dirMenuByUserId = sysMenuMapper.findDirMenuByUserId(userId);
        //查询目录对应的子菜单
        for (Map<String,Object> map : dirMenuByUserId) {
            //查询子菜单的id
            Long menuId = Long.parseLong(map.get("menuId")+"");
            //根据用户id 和子菜单id 查询子菜单
            List<Map<String, Object>> subList = sysMenuMapper.findMenuNotButtonByUserId(userId, menuId);
            //根据页面显示静态菜单时，json的数据结构，我们将子命名为list
            /*            "menuList": [{
                "menuId": 1,
                        "parentId": 0,
                        "parentName": null,
                        "name": "系统管理",
                        "url": null,
                        "perms": null,
                        "type": 0,
                        "icon": "fa fa-cog",
                        "orderNum": 0,
                        "open": null,
                        "list": [{
                    "menuId": 2,
                            "parentId": 1,
                            "parentName": null,
                            "name": "用户管理",
                            "url": "sys/user.html",
                            "perms": null,
                            "type": 1,
                            "icon": "fa fa-user",
                            "orderNum": 1,
                            "open": null,
                            "list": null
                },*/
            map.put("list",subList);
        }
        //js中还要了用户的角色信息，我们根据用户的id查询到
        List<String> permsByUseId = findPermsByUserId(userId);

        return R.ok().put("menuList",dirMenuByUserId).put("permissions",permsByUseId);
    }
}
